package middle

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"strconv"
	"DCOS-API/config"
	"DCOS-API/utils"
)

// flag只是控制是否强制验证token，有些接口可能需要处理登陆情况下做一些处理，不登陆情况下做一些其他的处理，并且都是有意义的处理，并不直接返回Unauthorized
// 如果flag为false并且token不存在的情况下不会进行token验证
// 如果flag为true或者token存在的情况是会进行token验证的
func Auth(flag bool) gin.HandlerFunc {
	return func(ctx *gin.Context) {
		conf := config.GetConfig()
		baseConf := conf.BaseConfig
		tokenString := ctx.Request.Header.Get("token")
		if tokenString == "" && !flag {
			ctx.Next()
			return
		}
		if tokenString == "" {
			utils.Unauthorized(ctx, "用户身份验证失败")
			ctx.Abort()
			return
		}
		tokenInfo, newTokenString, err := utils.RefreshToken(baseConf.SignKey, tokenString)
		if err != nil {
			utils.Unauthorized(ctx, "用户身份验证失败")
			ctx.Abort()
			return
		}
		//验证异地登陆
		//if tokenInfo["ip"] != ctx.ClientIP() {
		//utils.Unauthorized(ctx, "您的账号在异地登陆")
		//ctx.Abort()
		//return
		//}
		uid, err := strconv.Atoi(fmt.Sprintf("%v", tokenInfo["uid"]))
		if err != nil {
			utils.Unauthorized(ctx, "用户身份验证失败")
			ctx.Abort()
			return
		}
		ctx.Set("uid", uid)
		if role, ok := tokenInfo["role"]; ok {
			role1, err := strconv.Atoi(fmt.Sprintf("%v", role))
			if err != nil {
				utils.Unauthorized(ctx, "用户身份验证失败")
				ctx.Abort()
				return
			}
			ctx.Set("role", role1)
		}
		ctx.Writer.Header().Set("token", newTokenString)
		ctx.Header("token", newTokenString)
		ctx.Set("tokenInfo", tokenInfo)
		ctx.Set("token", newTokenString)
		ctx.Next()
	}
}
